package atom.core0.util;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import atom.core0.exception.BizSysException;

/**
 * <p>
 * Title: 日期处理的支持类
 * </p>
 * <p>
 * Description: 只能使用它的静态方法
 * </p>
 * <p>
 * Copyright: Copyright (c) 2004
 * </p>
 * <p>
 * </p>
 * 
 * @author hike_man
 * @version 1.0
 */
public class DateUtil
{

	/**
	 * 获取当前日期字符串，格式为yyyyMMdd
	 * 
	 * @return String
	 */
	public static String getCurrentDateStr(boolean tag)
	{
		if (tag)
			return new SimpleDateFormat("yyyy-MM-dd").format(new Date());
		else
			return new SimpleDateFormat("yyyyMMdd").format(new Date());
	}

	/**
	 * 获取当前时间字符串，格式为HHmmss
	 * 
	 * @return String
	 */
	public static String getCurrentTimeStr(boolean tag)
	{
		if (tag)
			return new SimpleDateFormat("HH:mm:ss").format(new Date());
		else
			return new SimpleDateFormat("HHmmss").format(new Date());
	}

	public static String getCurrentDateTimeStr(boolean tag)
	{
		if (tag)
			return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
		else
			return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
	}

	public static String getCurrentDateTimeMSStr(boolean tag)
	{
		if (tag)
			return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date());
		else
			return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
	}

	/**
	 * 获取当前的毫秒时间，为long值
	 * 
	 * @return long
	 */
	public static long getCurrentLongTime()
	{
		return new Date().getTime();
	}

	/*
	 * 获取当前日期前一天，格式为YYYYMMDD
	 */
	public static String getCurrentChnDateFront()
	{
		String strDate = new SimpleDateFormat("yyyyMMdd").format(addDays(new Date(), -1));
		strDate = strDate.substring(0, 4) + strDate.substring(4, 6) + strDate.substring(6);
		return strDate;
	}

	/**
	 * 获取对应Date的日期字符串，格式为yyyyMMddHHmmss
	 * 
	 * @param date
	 * @return
	 */

	public static String getDateTimeStr(Date date, boolean tag)
	{
		if (tag)
			return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
		else
			return new SimpleDateFormat("yyyyMMddHHmmss").format(date);
	}

	public static String getDateStr(Date date, boolean tag)
	{
		if (tag)
			return new SimpleDateFormat("yyyy-MM-dd").format(date);
		else
			return new SimpleDateFormat("yyyyMMdd").format(date);
	}

	/**
	 * 获取对应Date的时间字符串，格式为HHmmss
	 * 
	 * @param date
	 *            源Date
	 * @return String
	 */
	public static String getTimeStr(Date date, boolean tag)
	{
		if (tag)
			return new SimpleDateFormat("HH:mm:ss").format(date);
		else
			return new SimpleDateFormat("HHmmss").format(date);
	}

	/**
	 * 获取Sybase的日期转换函数表达式，用于SQL中，格式是yyyy/MM/dd HH:mm:ss，没办法，Sybase不支持yyyy-MM-dd
	 * HH:mm:ss
	 * 
	 * @param field
	 *            要转换成yyyy/MM/dd HH:mm:ss格式字符串的日期类型字段名
	 * @return String
	 */
	public static String getSybaseConvertSQL(String field)
	{
		return "(CONVERT(varchar(12), " + field + ", 111) + ' ' + CONVERT(varchar(12), " + field + ", 108))";
	}

	/**
	 * 获取Sybase的日期转换函数表达式，用于SQL中，格式是yyyy/MM/dd HH:mm:ss，没办法，Sybase不支持yyyy-MM-dd
	 * HH:mm:ss
	 * 
	 * @param field
	 *            要转换成yyyy/MM/dd HH:mm:ss格式字符串的日期类型字段名
	 * @return String
	 */
	public static String getSybaseYYYYMMDD(String field)
	{
		return "(CONVERT(varchar(12), " + field + ", 112))";
	}

	/**
	 * 获取一年的所有日期列表
	 * 
	 * @param year
	 *            年份
	 * @return ArrayList
	 */
	public static List getAllDates(String year)
	{
		ArrayList list = new ArrayList();
		int intYear;
		try
		{
			intYear = Integer.parseInt(year);
		}
		catch (NumberFormatException e)
		{ // 如果不是合法的年份，返回空的列表
			return list;
		}
		intYear = intYear - 1900; // 需要减去1900
		for (int month = 0; month < 12; month++)
		{
			for (int day = 1; day < 32; day++)
			{
				Date date = new Date(intYear, month, day);
				if (!list.contains(date))
				{
					list.add(date);
				}
			}
		}
		Collections.sort(list);
		return list;
	}

	/*
	 * 获取当前日期，格式为XXXX年XX月XX日
	 */
	public static String getCurrentChnDate()
	{
		String strDate = new SimpleDateFormat("yyyyMMdd").format(new Date());
		strDate = strDate.substring(0, 4) + "年" + strDate.substring(4, 6) + "月" + strDate.substring(6) + "日";
		return strDate;
	}

	/*
	 * 将日期转换为格式XXXX年XX月XX日
	 */
	public static String getChnDate(Date date)
	{
		String strDate = new SimpleDateFormat("yyyyMMdd").format(date);
		strDate = strDate.substring(0, 4) + "年" + strDate.substring(4, 6) + "月" + strDate.substring(6) + "日";
		return strDate;
	}

	/*
	 * 将日期转换为格式XXXX年XX月XX日
	 */
	public static String getChnTime(Date date)
	{
		String strDate = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒").format(new Date());
		return strDate;
	}

	/*
	 * 将字符串'yyyyMMdd'日期转换为格式XXXX年XX月XX日
	 */
	public static String getChnDate(String strDate)
	{
		return strDate.substring(0, 4) + "年" + strDate.substring(4, 6) + "月" + strDate.substring(6) + "日";
	}

	/**
	 * 检查日期字符串是否合法
	 * 
	 * @param dateStr
	 *            日期字符串
	 * @param pattern
	 *            日期格式
	 * @return 布尔
	 */
	// 'yyyyMMdd' 'HHmmss' 所以年月日不是yyyymmdd
	public static boolean isValidDate(String dateStr, String pattern)
	{
		java.text.SimpleDateFormat df = new java.text.SimpleDateFormat(pattern);

		df.setLenient(false);// 来强调严格遵守该格式
		// df.setLenient(true);
		Date date = null;
		try
		{
			date = df.parse(dateStr);
			return true;
		}
		catch (ParseException e)
		{
			return false;
		}

		// String result=df.format(date);//判断转换前后两个字符串是否相等即可知道合不合法
		// return result.equals(dateStr);
	}

	// 'yyyyMMdd' 'HHmmss' 所以年月日不是yyyymmdd
	public static void checkValidDate(String dateStr, String pattern) throws BizSysException
	{
		java.text.SimpleDateFormat df = new java.text.SimpleDateFormat(pattern);

		df.setLenient(false);// 来强调严格遵守该格式
		// df.setLenient(true);
		try
		{
			df.parse(dateStr);
		}
		catch (ParseException e)
		{
			throw new BizSysException("9303", "[" + dateStr + "]日期格式非法");

		}
	}

	public static int getMaxdayInAMonth(int year, int month)
	{
		Calendar time = Calendar.getInstance();
		time.clear();
		time.set(Calendar.YEAR, year); // year 为 int
		time.set(Calendar.MONTH, month - 1);// 注意,Calendar对象默认一月为0
		int day = time.getActualMaximum(Calendar.DAY_OF_MONTH);// 本月份的天数
		// 注：在使用set方法之前，必须先clear一下，否则很多信息会继承自系统当前时间
		return day;

	}

	// Calendar转化为Date
	public static Date CalendarToDate()
	{
		Calendar cal = Calendar.getInstance();
		Date date = cal.getTime();
		return date;
	}

	// Date转化为Calendar
	public static Calendar DateToCalendar()
	{
		Date date = new Date();
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return cal;
	}

	/**
	 * 按日加减日期
	 * 
	 * @param date
	 *            ：日期
	 * @param num
	 *            ：要加减的日数
	 * @return：成功，则返回加减后的日期；失败，则返回null
	 */
	public static Date addDays(Date date, int num)
	{
		if (date == null)
		{
			return null;
		}

		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.DAY_OF_MONTH, num);

		return c.getTime();
	}

	/**
	 * 按月加减日期
	 * 
	 * @param date
	 *            ：日期
	 * @param num
	 *            ：要加减的月数
	 * @return：成功，则返回加减后的日期；失败，则返回null
	 */
	public static Date addMonths(Date date, int num)
	{
		if (date == null)
		{
			return null;
		}
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.MONTH, num);
		return c.getTime();
	}

	/**
	 * 按年加减日期
	 * 
	 * @param date
	 *            ：日期
	 * @param num
	 *            ：要加减的年数
	 * @return：成功，则返回加减后的日期；失败，则返回null
	 */
	public static Date addYears(Date date, int num)
	{
		if (date == null)
		{
			return null;
		}
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.YEAR, num);
		return c.getTime();
	}

	/**
	 * 按秒 加减日期
	 * 
	 * @param date
	 *            ：日期
	 * @param num
	 *            ：要加减的秒
	 * @return：成功，则返回加减后的日期；失败，则返回null
	 */
	public static Date addSeconds(Date date, int num)
	{
		if (date == null)
		{
			return null;
		}
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.SECOND, num);
		return c.getTime();
	}

	/**
	 * 按秒 加减日期
	 * 
	 * @param date
	 *            ：日期
	 * @param num
	 *            ：要加减的秒
	 * @return：成功，则返回加减后的日期；失败，则返回null
	 */
	public static Date addMillisSeconds(Date date, int num)
	{
		if (date == null)
		{
			return null;
		}
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.MILLISECOND, num);
		return c.getTime();
	}

	public static Date getDate(String dateStr, String dateFormat) throws Exception
	{
		SimpleDateFormat df = new SimpleDateFormat(dateFormat);
		java.util.Date cDate = df.parse(dateStr);

		return cDate;
	}

	// yyyyMMddhhmmss hh是12小时 HH是24小时
	public static Date getDate(String dateStr) throws Exception
	{
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
		java.util.Date cDate = df.parse(dateStr);

		return cDate;
	}

	public static Date convertTimerToDate(Timestamp time) throws Exception
	{
		Date dd = new Date(time.getTime());
		return dd;
	}

	public static long DateDiff(Date date1, Date date2) throws Exception
	{
		return date1.getTime() - date2.getTime();
	}

	public static int DateDiffDay(Date date1, Date date2) throws Exception
	{
		int day = (int) ((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
		return day;
	}

	/**
	 * 获取当前日期上一个月的第一天，格式为yyyy-MM-dd HH:ms:ss
	 * 
	 * @return String
	 */
	public static String getLastMonthFirstDay(Date date)
	{
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, -1);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		return getDateTimeStr(calendar.getTime(), true);
	}

	/**
	 * 获取当前日期上一个月的第一天，格式为yyyy-MM-dd HH:ms:ss
	 * 
	 * @return String
	 */
	public static String getLastMonthEndDay(Date date)
	{
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		calendar.add(Calendar.DAY_OF_MONTH, -1);
		calendar.set(Calendar.HOUR_OF_DAY, 23);
		calendar.set(Calendar.MINUTE, 59);
		calendar.set(Calendar.SECOND, 59);
		return getDateTimeStr(calendar.getTime(), true);
	}

	public static boolean isWeekend(String yyyyMMdd_date) throws Exception
	{
		SimpleDateFormat sdfInput = new SimpleDateFormat("yyyyMMdd");
		Calendar calendar = Calendar.getInstance();
		Date date = new Date();
		date = sdfInput.parse(yyyyMMdd_date);
		calendar.setTime(date);
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
		System.out.println(dayOfWeek);
		if (dayOfWeek >= 1 && dayOfWeek <= 5)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	public static void initLocalTime(Date databaseTime) throws BizSysException
	{
		try
		{
			String time = DateUtil.getDateTimeStr(databaseTime, false);
			String year = time.substring(0, 4);
			String month = time.substring(4, 6);
			String day = time.substring(6, 8);
			String hours = time.substring(8, 10);
			String minutes = time.substring(10, 12);
			String seconds = time.substring(12, 14);
			String osName = System.getProperty("os.name");
			if (osName.matches("^(?i)Windows.*$"))
			{
				Runtime.getRuntime().exec("cmd /c date " + year + "-" + month + "-" + day);
				Runtime.getRuntime().exec("cmd /c time " + hours + ":" + minutes + ":" + seconds);
			}
			else
			// linux or solaris;
			{
				// date 091815302010.59 ， 9月18日 15点30分 2010年，59秒 ，
				Runtime.getRuntime().exec("date " + month + day + hours + minutes + year + "." + seconds);
			}
		}
		catch (Exception e)
		{
			throw new BizSysException("调整时间出现错误");
		}
	}
	
}
